package com.educate.util;

import cn.hutool.core.lang.UUID;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.List;

/**
 * @author yjj
 * @date 2021/11/22
 * @description: 图片上传、删除
 */
@Component
public class OssFileUpload {

    @Autowired
    private OSSClient ossClient;

    /**
     * oss上传图片
     * @param file 图片文件
     * @param folderType  保存的文件夹名
     * @return  文件名
     */
    public String ossUpload(MultipartFile file,String folderType){
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        // 获取原始文件名
        String originalFileName = file.getOriginalFilename();
        // 文件名
        String fileName =username + UUID.randomUUID().toString().replaceAll("-", "");
        if (originalFileName != null){
            // 获取原始文件名的后缀，如.jpg .png
            fileName = folderType + "/" + fileName + originalFileName.substring(originalFileName.lastIndexOf("."));
        } else {
            // 一般来说这种情况是不存在的
            fileName = folderType + "/" + fileName + ".jpg";
        }
        try {
            ossClient.putObject(OssConstant.BUCKET_NAME, fileName, file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileName;
    }

    /**
     * 上传视频文件
     * @param file  视频文件
     * @param folderType 保存的文件夹名
     * @return 文件名
     */
    public String ossVideoUpload(MultipartFile file,String folderType){
        //获取用户名
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        //获取上传文件的原始名称
        String originalFilename = file.getOriginalFilename();
        //文件名
        String fileName = folderType + "/" + username;
        if(originalFilename != null){
            fileName = fileName + "/" +originalFilename;
        }else {
            fileName = fileName + "/未命名" + ".mp4";

        }
        try {
            //上传到云端
            ossClient.putObject(OssConstant.BUCKET_NAME, fileName, file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileName;
    }

    /**
     * 删除OSS里的文件/文件夹(文件夹内不能有文件)
     * @param fileName 文件名 - 完整文件名包括文件夹名
     * @return true 删除成功
     */
    public boolean ossDelete(String fileName){
        ossClient.deleteObject(OssConstant.BUCKET_NAME, fileName);
        return true;
    }

    /**
     * 批量删除OSS里的文件
     * @param fileNames 文件名集合 - 完整文件名包括文件夹名
     * @return
     */
    public List<String> ossDeleteBatch(List<String> fileNames){
        DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(OssConstant.BUCKET_NAME).withKeys(fileNames));
        // 返回的就是删除成功的图片名集合(图片不存在，也会返回)
        return deleteObjectsResult.getDeletedObjects();
    }

    /**
     * 查询OSS里的文件是否存在
     * @param fileName 文件名 - 完整文件名包括文件夹名
     * @return 是否存在:true or false
     */
    public Boolean isExist(String fileName) {
        return ossClient.doesObjectExist(OssConstant.BUCKET_NAME, fileName);
    }

}
